// ==UserScript==
// @name         禁止视频自动播放
// @namespace    https://github.com/WhiteSevs/TamperMonkeyScript
// @version      1.1.2
// @author       WhiteSevs (原作者) & 修改者
// @description  阻止网站视频自动播放，但允许用户点击后正常播放视频
// @license      GPL-3.0-only
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @updateURL https://gitee.com/selling-surprises/Greasyfork-Script-repository/raw/main/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC/%E7%A6%81%E6%AD%A2%E8%A7%86%E9%A2%91%E8%87%AA%E5%8A%A8%E6%92%AD%E6%94%BE/%E7%A6%81%E6%AD%A2%E8%A7%86%E9%A2%91%E8%87%AA%E5%8A%A8%E6%92%AD%E6%94%BE.user.js
// ==/UserScript==

(function() {
    'use strict';
    
    /**
     * 日志输出
     */
    const log = {
        debug: console.debug.bind(console, "%c[视频播放控制]%c", "color: #409EFF; font-weight: bold;", ""),
        info: console.info.bind(console, "%c[视频播放控制]%c", "color: #409EFF; font-weight: bold;", ""),
        success: console.log.bind(console, "%c[视频播放控制]%c", "color: #67C23A; font-weight: bold;", ""),
        warn: console.warn.bind(console, "%c[视频播放控制]%c", "color: #E6A23C; font-weight: bold;", ""),
        error: console.error.bind(console, "%c[视频播放控制]%c", "color: #F56C6C; font-weight: bold;", "")
    };
    
    /**
     * DOM相关工具函数
     */
    const domUtils = {
        /**
         * 选择单个元素
         * @param {string} selector - CSS选择器
         * @returns {Element|null} - 匹配的元素或null
         */
        $(selector) {
            return document.querySelector(selector);
        },
        
        /**
         * 选择多个元素
         * @param {string} selector - CSS选择器
         * @returns {NodeListOf<Element>} - 匹配的元素列表
         */
        $$(selector) {
            return document.querySelectorAll(selector);
        }
    };
    
    // 标记用户是否已交互
    let userHasInteracted = false;
    
    /**
     * 视频控制器
     */
    const VideoController = {
        // 视频选择器
        videoSelectors: ['video', 'iframe[src*="video"]', 'iframe[src*="player"]'],
        
        /**
         * 处理视频元素
         */
        processVideo(video) {
            if (!video || video.hasAttribute('data-processed')) return;
            
            // 标记为已处理
            video.setAttribute('data-processed', 'true');
            
            // 移除自动播放属性
            video.autoplay = false;
            video.removeAttribute('autoplay');
            
            // 如果视频正在播放且用户未交互，则暂停
            if (!video.paused && !userHasInteracted) {
                video.pause();
                log.success("已暂停自动播放视频");
            }
            
            // 添加播放事件监听器
            video.addEventListener('play', this.handleVideoPlay, true);
        },
        
        /**
         * 处理视频播放事件
         */
        handleVideoPlay(event) {
            // 如果用户已交互，允许播放
            if (userHasInteracted) return;
            
            // 如果用户未交互，暂停视频
            const video = event.target;
            video.pause();
            log.success("已阻止视频自动播放");
            
            // 为这个视频添加点击事件允许播放
            if (!video.hasAttribute('data-click-handler')) {
                video.setAttribute('data-click-handler', 'true');
                video.addEventListener('click', function() {
                    userHasInteracted = true;
                    video.play().catch(err => console.error("播放失败:", err));
                    log.success("用户点击播放视频");
                    
                    // 移除所有视频的播放拦截
                    setTimeout(() => {
                        document.querySelectorAll('video').forEach(v => {
                            v.removeEventListener('play', VideoController.handleVideoPlay, true);
                        });
                    }, 100);
                });
            }
        },
        
        /**
         * 处理iframe视频
         */
        processIframe(iframe) {
            if (!iframe || iframe.hasAttribute('data-processed')) return;
            
            // 标记为已处理
            iframe.setAttribute('data-processed', 'true');
            
            // 修改iframe的src，移除自动播放参数
            if (iframe.src && !userHasInteracted) {
                let src = iframe.src;
                if (src.includes('autoplay=1')) {
                    src = src.replace(/autoplay=1/g, 'autoplay=0');
                    iframe.src = src;
                    log.success("已移除iframe的自动播放参数");
                }
            }
            
            // 修改allow属性，移除autoplay
            if (iframe.hasAttribute('allow')) {
                const allow = iframe.getAttribute('allow');
                if (allow.includes('autoplay')) {
                    iframe.setAttribute('allow', allow.replace(/autoplay[^;]*/g, ''));
                }
            }
        },
        
        /**
         * 处理页面中的所有视频元素
         */
        processAllVideos() {
            // 处理直接的video标签
            domUtils.$$('video').forEach(video => this.processVideo(video));
            
            // 处理iframe中的视频
            domUtils.$$('iframe[src*="video"], iframe[src*="player"]').forEach(iframe => 
                this.processIframe(iframe)
            );
        },
        
        /**
         * 初始化视频控制
         */
        init() {
            // 监视DOM变化，处理新增的视频元素
            const observer = new MutationObserver((mutations) => {
                let hasNewElements = false;
                
                mutations.forEach(mutation => {
                    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                        hasNewElements = true;
                    }
                });
                
                if (hasNewElements) {
                    this.processAllVideos();
                }
            });
            
            observer.observe(document.documentElement, {
                childList: true,
                subtree: true
            });
            
            // 初次处理
            this.processAllVideos();
            
            // 在DOM加载完成后再处理一次
            document.addEventListener('DOMContentLoaded', () => {
                this.processAllVideos();
            });
            
            // 在页面加载完成后处理一次
            window.addEventListener('load', () => {
                this.processAllVideos();
            });
            
            // 劫持HTMLMediaElement.play方法
            if (typeof HTMLMediaElement !== 'undefined') {
                const originalPlay = HTMLMediaElement.prototype.play;
                
                HTMLMediaElement.prototype.play = function() {
                    // 如果用户未交互，阻止自动播放
                    if (!userHasInteracted) {
                        log.success("已拦截播放请求，等待用户交互");
                        // 允许用户点击视频播放
                        if (!this.hasAttribute('data-click-handler')) {
                            this.setAttribute('data-click-handler', 'true');
                            this.addEventListener('click', function() {
                                userHasInteracted = true;
                                originalPlay.apply(this);
                                log.success("用户点击播放视频");
                            });
                        }
                        return new Promise((resolve, reject) => {
                            reject(new Error('等待用户交互'));
                        });
                    }
                    
                    // 用户已交互，允许播放
                    return originalPlay.apply(this);
                };
            }
        }
    };
    
    /**
     * 用户交互检测
     */
    const UserInteractionDetector = {
        init() {
            const events = ['click', 'touchstart', 'keydown', 'mousedown'];
            
            events.forEach(eventType => {
                document.addEventListener(eventType, () => {
                    // 标记用户已交互
                    userHasInteracted = true;
                    document.body.setAttribute('data-user-interacted', 'true');
                    log.success("检测到用户交互，允许视频播放");
                }, { once: true });
            });
        }
    };
    
    // 初始化
    function init() {
        log.info("视频播放控制已加载 - 阻止自动播放但允许手动播放");
        
        // 初始化用户交互检测
        UserInteractionDetector.init();
        
        // 初始化视频控制
        VideoController.init();
    }
    
    // 运行初始化
    init();
})(); 